#C 语言标准库头文件 math.h
这个头文件提供 数学 的相关功能,例如计算指数,对数,三角函数以及近似取整等。
需要链接数学库,例如在 gcc 中需要添加 -lm
链接选项。
#include <stdio.h>
#include <math.h>
#include <float.h>
int main(void) {
printf("sqrt(16.0) = %.2f\n", sqrt(16.0));
printf("pow(2, 5) = %.2f\n", pow(2, 5));
printf("fabs(-3.14) = %.2f\n", fabs(-3.14));
double angle = 45.0 * M_PI / 180.0;
printf("sin(45°) = %.4f\n", sin(angle));
printf("cos(45°) = %.4f\n", cos(angle));
printf("tan(45°) = %.4f\n", tan(angle));
printf("exp(1.0) = %.4f (e^1)\n", exp(1.0));
printf("log(10.0) = %.4f (自然对数)\n", log(10.0));
printf("log10(100.0) = %.4f (常用对数)\n", log10(100.0));
printf("ceil(3.2) = %.2f\n", ceil(3.2));
printf("floor(3.8) = %.2f\n", floor(3.8));
printf("round(3.5) = %.2f\n", round(3.5));
printf("fmod(10.3, 3.0) = %.2f (浮点余数)\n", fmod(10.3, 3.0));
printf("hypot(3, 4) = %.2f (直角三角形斜边)\n", hypot(3, 4));
printf("M_PI = %.10f (圆周率π)\n", M_PI);
printf("M_E = %.10f (自然对数底数e)\n", M_E);
return 0;
}
运行结果:
user@host:~ $ gcc main.c -lm
user@host:~ $ ./a.out
sqrt(16.0) = 4.00
pow(2, 5) = 32.00
fabs(-3.14) = 3.14
sin(45°) = 0.7071
cos(45°) = 0.7071
tan(45°) = 1.0000
exp(1.0) = 2.7183 (e^1)
log(10.0) = 2.3026 (自然对数)
log10(100.0) = 2.0000 (常用对数)
ceil(3.2) = 4.00
floor(3.8) = 3.00
round(3.5) = 4.00
fmod(10.3, 3.0) = 1.30 (浮点余数)
hypot(3, 4) = 5.00 (直角三角形斜边)
M_PI = 3.1415926536 (圆周率π)
M_E = 2.7182818285 (自然对数底数e)
类型 | 标准 | 说明 |
---|
float_t | C99 | 至少和 float 宽度一样的,最高效的单精度浮点类型 |
double_t | C99 | 至少和 double 宽度一样的,最高效的双精度浮点类型 |
常量 | 标准 | 说明 |
---|
HUGE_VALF | C99 | 表示数值太大而无法被 float 表示 |
HUGE_VAL | C89 | 表示数值太大而无法被 double 表示 |
HUGE_VALL | C99 | 表示数值太大而无法被 long double 表示 |
INFINITY | C99 | 表示正无穷大,注意两个 INFINITY 之间可能不相等,应当使用 isinf 判断 |
NAN | C99 | 表示不是一个数值(Not A Number),注意两个 NAN 之间永远不相等,应当使用 isnan 判断 |
FP_FAST_FMAF | C99 | 指示是否支持 float 类型的快速乘加操作,即 fmaf 函数 |
FP_FAST_FMA | C99 | 指示是否支持 double 类型的快速乘加操作,即 fma 函数 |
FP_FAST_FMAL | C99 | 指示是否支持 long double 类型的快速乘加操作,即 fmal 函数 |
FP_ILOGB0 | C99 | ilogb 函数在参数为 0 时的结果 |
FP_ILOGBNAN | C99 | ilogb 函数在参数为 NAN 时的结果 |
math_errhandling | C99 | 定义数学函数使用的错误处理机制 |
MATH_ERRNO | C99 | 使用 errno |
MATH_ERREXCEPT | C99 | 使用 浮点异常 |
FP_NORMAL | C99 | 作为 fpclassify 的返回值,表示正规浮点值 |
FP_SUBNORMAL | C99 | 作为 fpclassify 的返回值,表示 次正规数 |
FP_ZERO | C99 | 作为 fpclassify 的返回值,表示正零或负零 |
FP_INFINITE | C99 | 作为 fpclassify 的返回值,表示正无穷或负无穷 |
FP_NAN | C99 | 作为 fpclassify 的返回值,表示不是一个数值(Not A Number) |
基本函数 | 标准 | 说明 |
---|
fabs | C89 | 计算 double 类型的绝对值 |
fabsf | C99 | 计算 float 类型的绝对值 |
fabsl | C99 | 计算 long double 类型的绝对值 |
fmod | C89 | double 类型的除法取余,商向 0 取整 |
fmodf | C99 | float 类型的除法取余,商向 0 取整 |
fmodl | C99 | long double 类型的除法取余,商向 0 取整 |
remainder | C99 | double 类型的除法取余,商四舍六入五成双取整 |
remainderf | C99 | float 类型的除法取余,商四舍六入五成双取整 |
remainderl | C99 | long double 类型的除法取余,商四舍六入五成双取整 |
remquo | C99 | double 类型的除法取余,商四舍六入五成双取整,同时返回有效数字的位数 |
remquof | C99 | float 类型的除法取余,商四舍六入五成双取整,同时返回有效数字的位数 |
remquol | C99 | long double 类型的除法取余,商四舍六入五成双取整,同时返回有效数字的位数 |
fma | C99 | double 类型的快速乘加运算(x * y + z ) |
fmaf | C99 | float 类型的快速乘加运算(x * y + z ) |
fmal | C99 | long double 类型的快速乘加运算(x * y + z ) |
fmax | C99 | double 类型取最大值 |
fmaxf | C99 | float 类型取最大值 |
fmaxl | C99 | long double 类型取最大值 |
fmin | C99 | double 类型取最小值 |
fminf | C99 | float 类型取最小值 |
fminl | C99 | long double 类型取最小值 |
fdim | C99 | 计算两个 double 值的正差(max(0, x-y) ) |
fdimf | C99 | 计算两个 float 值的正差(max(0, x-y) ) |
fdiml | C99 | 计算两个 long double 值的正差(max(0, x-y) ) |
nan | C99 | 返回一个 double 类型的 NAN |
nanf | C99 | 返回一个 float 类型的 NAN |
nanl | C99 | 返回一个 long double 类型的 NAN |
指数函数 | 标准 | 说明 |
---|
exp | C89 | 计算自然常数 e 的幂(),类型为 double |
expf | C99 | 计算自然常数 e 的幂(),类型为 flaot |
expl | C99 | 计算自然常数 e 的幂(),类型为 long double |
exp2 | C99 | 计算 2 的幂(),类型为 double |
exp2f | C99 | 计算 2 的幂(),类型为 flaot |
exp2l | C99 | 计算 2 的幂(),类型为 long double |
expm1 | C99 | 计算自然常数 e 的幂减一(),类型为 double |
expm1f | C99 | 计算自然常数 e 的幂减一(),类型为 flaot |
expm1l | C99 | 计算自然常数 e 的幂减一(),类型为 long double |
log | C89 | 计算底为自然常数 e 的对数(),类型为 double |
logf | C99 | 计算底为自然常数 e 的对数(),类型为 flaot |
logl | C99 | 计算底为自然常数 e 的对数(),类型为 long double |
log10 | C99 | 计算底为 10 的对数(),类型为 double |
log10f | C99 | 计算底为 10 的对数(),类型为 flaot |
log10l | C99 | 计算底为 10 的对数(),类型为 long double |
log2 | C99 | 计算底为 2 的对数(),类型为 double |
log2f | C99 | 计算底为 2 的对数(),类型为 flaot |
log2l | C99 | 计算底为 2 的对数(),类型为 long double |
log1p | C99 | 计算底为自然常数 e,幂为 1 + x 的对数(),类型为 double |
log1pf | C99 | 计算底为自然常数 e,幂为 1 + x 的对数的对数(),类型为 flaot |
log1pl | C99 | 计算底为自然常数 e,幂为 1 + x 的对数的对数(),类型为 long double |
幂函数 | 标准 | 说明 |
---|
pow | C89 | 计算乘方(),类型为 double |
powf | C99 | 计算乘方(),类型为 flaot |
powl | C99 | 计算乘方(),类型为 long double |
sqrt | C89 | 计算平方根(),类型为 double |
sqrtf | C99 | 计算平方根(),类型为 flaot |
sqrtl | C99 | 计算平方根(),类型为 long double |
cbrt | C99 | 计算三次方根(),类型为 double |
cbrtf | C99 | 计算三次方根(),类型为 flaot |
cbrtl | C99 | 计算三次方根(),类型为 long double |
hypot | C99 | 计算平方和的根(),类型为 double |
hypotf | C99 | 计算平方和的根(),类型为 flaot |
hypotl | C99 | 计算平方和的根(),类型为 long double |
三级函数 | 标准 | 说明 |
---|
sin | C89 | 计算 double 类型的正弦() |
sinf | C99 | 计算 float 类型的正弦() |
sinl | C99 | 计算 long double 类型的正弦() |
cos | C89 | 计算 double 类型的余弦() |
cosf | C99 | 计算 float 类型的余弦() |
cosl | C99 | 计算 long double 类型的余弦() |
tan | C89 | 计算 double 类型的正切() |
tanf | C99 | 计算 float 类型的正切() |
tanl | C99 | 计算 long double 类型的正切() |
asin | C89 | 计算 double 类型的反正弦() |
asinf | C99 | 计算 float 类型的反正弦() |
asinl | C99 | 计算 long double 类型的反正弦() |
acos | C89 | 计算 double 类型的反余弦() |
acosf | C99 | 计算 float 类型的反余弦() |
acosl | C99 | 计算 long double 类型的反余弦() |
atan | C89 | 计算 double 类型的反正切() |
atanf | C99 | 计算 float 类型的反正切() |
atanl | C99 | 计算 long double 类型的反正切() |
双曲函数 | 标准 | 说明 |
---|
sinh | C89 | 计算 double 类型的双曲正弦() |
sinhf | C99 | 计算 float 类型的双曲正弦() |
sinhl | C99 | 计算 long double 类型的双曲正弦() |
cosh | C89 | 计算 double 类型的双曲余弦() |
coshf | C99 | 计算 float 类型的双曲余弦() |
coshl | C99 | 计算 long double 类型的双曲余弦() |
tanh | C89 | 计算 double 类型的双曲正切() |
tanhf | C99 | 计算 float 类型的双曲正切() |
tanhf | C99 | 计算 long double 类型的双曲正切() |
asinh | C99 | 计算 double 类型的反双曲正弦() |
asinhf | C99 | 计算 float 类型的反双曲正弦() |
asinhl | C99 | 计算 long double 类型的反双曲正弦() |
acosh | C99 | 计算 double 类型的反双曲余弦() |
acoshf | C99 | 计算 float 类型的反双曲余弦() |
acoshl | C99 | 计算 long double 类型的反双曲余弦() |
atanh | C99 | 计算 double 类型的反双曲正切() |
atanhf | C99 | 计算 float 类型的反双曲正切() |
atanhl | C99 | 计算 long double 类型的反双曲正切() |
误差与 Gamma 函数 | 标准 | 说明 |
---|
erf | C99 | 计算 double 类型的误差函数 |
erff | C99 | 计算 float 类型的误差函数 |
erfl | C99 | 计算 long double 类型的误差函数 |
erfc | C99 | 计算 double 类型的互补误差函数 |
erfcf | C99 | 计算 float 类型的互补误差函数 |
erfcl | C99 | 计算 long double 类型的互补误差函数 |
tgamma | C99 | 计算 double 类型的 Gamma 函数 |
tgammaf | C99 | 计算 float 类型的 Gamma函数 |
tgammal | C99 | 计算 long double 类型的 Gamma 函数 |
lgamma | C99 | 计算 double 类型 Gamma 函数的自然对数 |
lgammaf | C99 | 计算 float 类型 Gamma 函数的自然对数 |
lgammal | C99 | 计算 long double 类型 Gamma 函数的自然对数 |
近似取整函数 | 标准 | 说明 |
---|
ceil | C89 | double 类型向上取整() |
ceilf | C99 | float 类型向上取整() |
ceill | C99 | long double 类型向上取整() |
floor | C89 | double 类型向下取整() |
floorf | C99 | float 类型向下取整() |
floorl | C99 | long double 类型向下取整() |
trunc | C99 | double 类型向零取整 |
truncf | C99 | float 类型向零取整 |
truncl | C99 | long double 类型向零取整 |
round | C99 | double 类型四舍五入取整 |
roundf | C99 | float 类型四舍五入取整 |
roundl | C99 | long double 类型四舍五入取整 |
lround | C99 | double 到 long int 的四舍五入取整 |
lroundf | C99 | float 到 long int 的四舍五入取整 |
lroundl | C99 | long double 到 long int 的四舍五入取整 |
llround | C99 | double 到 long long int 的四舍五入取整 |
llroundf | C99 | float 到 long long int 的四舍五入取整 |
llroundl | C99 | long double 到 long long int 的四舍五入取整 |
nearbyint | C99 | double 类型按照 当前舍入模式 取整 |
nearbyintf | C99 | float 类型按照 当前舍入模式 取整 |
nearbyintl | C99 | long double 类型按照 当前舍入模式 取整 |
rint | C99 | double 类型按照 当前舍入模式 取整 |
rintf | C99 | float 类型按照 当前舍入模式 取整 |
rintl | C99 | long double 类型按照 当前舍入模式 取整 |
lrint | C99 | double 到 long int 类型按照 当前舍入模式 取整 |
lrintf | C99 | float 到 long int 类型按照 当前舍入模式 取整 |
lrintl | C99 | long double 到 long int 类型按照 当前舍入模式 取整 |
llrint | C99 | double 到 long long int 类型按照 当前舍入模式 取整 |
llrintf | C99 | float 到 long long int 类型按照 当前舍入模式 取整 |
llrintl | C99 | long double 到 long long int 类型按照 当前舍入模式 取整 |
浮点操作函数 | 标准 | 说明 |
---|
frexp | C89 | 将 double 分解为有效数字和 2 的幂 |
frexpf | C99 | 将 float 分解为有效数字和 2 的幂 |
frexpl | C99 | 将 long double 分解为有效数字和 2 的幂 |
ldexp | C89 | 将 double 乘以 2 的幂 |
ldexpf | C99 | 将 float 乘以 2 的幂 |
ldexpl | C99 | 将 long double 乘以 2 的幂 |
modf | C89 | 将 double 分解为整数部分和小数部分 |
modff | C99 | 将 float 分解为整数部分和小数部分 |
modfl | C99 | 将 long double 分解为整数部分和小数部分 |
scalbn | C99 | 高效计算 FLT_RADIX 的 int 次幂,结果为 double |
scalbnf | C99 | 高效计算 FLT_RADIX 的 int 次幂,结果为 float |
scalbnl | C99 | 高效计算 FLT_RADIX 的 int 次幂,结果为 long double |
scalbln | C99 | 高效计算 FLT_RADIX 的 long int 次幂,结果为 double |
scalblnf | C99 | 高效计算 FLT_RADIX 的 long int 次幂,结果为 float |
scalblnl | C99 | 高效计算 FLT_RADIX 的 long int 次幂,结果为 long double |
ilogb | C99 | 从 double 中提取 int 类型的指数 |
ilogbf | C99 | 从 float 中提取 int 类型的指数 |
ilogbl | C99 | 从 long double 中提取 int 类型的指数 |
logb | C99 | 从 double 中提取 double 类型的指数 |
logbf | C99 | 从 float 中提取 float 类型的指数 |
logbl | C99 | 从 long double 中提取 long double 类型的指数 |
nextafter | C99 | 获得 double 类型的下一个可表示的浮点数 |
nextafterf | C99 | 获得 float 类型的下一个可表示的浮点数 |
nextafterl | C99 | 获得 long double 类型的下一个可表示的浮点数 |
nexttoward | C99 | 获得 double 类型的下一个可表示的浮点数 |
nexttowardf | C99 | 获得 float 类型的下一个可表示的浮点数 |
nexttowardl | C99 | 获得 long double 类型的下一个可表示的浮点数 |
copysign | C99 | 拷贝 double 类型的符号位 |
copysignf | C99 | 拷贝 float 类型的符号位 |
copysignl | C99 | 拷贝 long double 类型的符号位 |
判断函数 | 标准 | 说明 |
---|
fpclassify | C99 | 获得浮点数的分类 |
isfinite | C99 | 判断浮点数是否有一个有限值(NAN 和 INFINITY 均不是) |
isinf | C99 | 判断浮点数是否是无限 |
isnan | C99 | 判断浮点数是否不是数值(Not A Number) |
signbit | C99 | 判断浮点数是否为负 |
isgreater | C99 | 判断大于 |
isgreaterequal | C99 | 判断大于等于 |
isless | C99 | 判断小于 |
islessequal | C99 | 判断小于等于 |
islessgreater | C99 | 判断大于或小于 |
isunordered | C99 | 判断无序,即至少一个是 NAN |
#推荐阅读